package post

import (
	"github.com/gin-gonic/gin"
	. "myplatform/handler"
	"myplatform/libs/errcode"
	"myplatform/libs/valiutils"
	"myplatform/model"
	"strconv"
)

// 查看所有post,接口
func Getpost(c *gin.Context) {
	if p, err := model.GetPost(); err != nil {
		//SendResponse(c, 1004, "查询数据失败", err)
		SendRsp(c, errcode.SearchError, nil)
	} else {
		SendRsp(c, errcode.OK, p)
	}
}

// 根据关键字查post
func GetPostBykey(c *gin.Context) {
	kw := c.Query("kw") //?后传参而不是根据/:kw传参
	if s, err := model.GetPostByKey(kw); err != nil {
		SendRsp(c, errcode.SearchError, nil)
		return
	} else {
		SendRsp(c, errcode.OK, s)
	}
}

// 通过帖子找类型
func GetTypeBypost(c *gin.Context) {
	id, err := strconv.Atoi(c.Query("id"))
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}
	var p model.Post
	p.Pid = uint64(id)
	if err := p.GetTypeByPost(); err != nil {
		SendRsp(c, errcode.SearchError, nil)
		return
	}
	SendRsp(c, errcode.OK, p.Types)
}

// 根据pid找帖子
func GetPostBypid(c *gin.Context) {
	id, err := strconv.Atoi(c.Query("id"))
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}
	if s, err := model.GetPostByPid(uint64(id)); err != nil {
		SendRsp(c, errcode.SearchError, nil)
		return
	} else {
		SendRsp(c, errcode.OK, s)
	}
}

func GetPostBypidHTML(c *gin.Context) {
	c.HTML(200, "postinfo.html", gin.H{})
}

// 根据帖子找作者
func GetWriterBypost(c *gin.Context) {
	id, err := strconv.Atoi(c.Query("id"))
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}
	var p model.Post
	p.Pid = uint64(id)
	if err := p.GetWriterByPost(); err != nil {
		SendRsp(c, errcode.SearchError, nil)
		return
	}
	SendRsp(c, errcode.OK, p.Writer)
}

// 根据post找评论
func GetCommentBypost(c *gin.Context) {
	id, err := strconv.Atoi(c.Query("id"))
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}
	var p model.Post
	p.Pid = uint64(id)
	if err := p.GetCommentByPost(); err != nil {
		SendRsp(c, errcode.SearchError, err)
		return
	}
	SendRsp(c, errcode.OK, p.Comment)
}

func Addlike(c *gin.Context) {
	// 从查询参数中获取 postId
	postIdStr := c.Query("id")
	postId, err := strconv.ParseUint(postIdStr, 10, 64) // 注意这里使用 ParseUint 而不是 Atoi，因为 Pid 是 uint64
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}

	// 根据 postId 获取帖子
	var p model.Post
	if err := model.GetPostByPidC(postId, &p); err != nil { // 假设 GetPostByPid 现在接受一个 uint64 和一个指向 Post 的指针
		SendRsp(c, errcode.SearchError, nil)
		return
	}

	// 点赞逻辑：增加 LikeCount
	p.LikeCount++

	// 将更改保存回数据库
	if err := model.DB.Self.Save(&p).Error; err != nil { // 假设 model.DB 是 GORM 数据库连接的实例
		SendRsp(c, errcode.InternalError, nil) // 使用适当的错误码来表示内部错误
		return
	}

	// 发送成功响应（如果需要的话）
	// 例如：c.JSON(http.StatusOK, gin.H{"success": true, "likes": p.LikeCount})
	// 但由于您使用了 SendRsp，可能需要修改它以包含所需的响应数据
	SendRsp(c, errcode.OK, gin.H{"success": true, "likes": p.LikeCount})
}

func Addcollect(c *gin.Context) {
	// 从查询参数中获取 postId
	postIdStr := c.Query("id")
	postId, err := strconv.ParseUint(postIdStr, 10, 64) // 注意这里使用 ParseUint 而不是 Atoi，因为 Pid 是 uint64
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}
	// 根据 postId 获取帖子
	var p model.Post
	if err := model.GetPostByPidC(postId, &p); err != nil { // 假设 GetPostByPid 现在接受一个 uint64 和一个指向 Post 的指针
		SendRsp(c, errcode.SearchError, nil)
		return
	}

	// 点赞逻辑：增加 LikeCount
	p.CollectCount++

	// 将更改保存回数据库
	if err := model.DB.Self.Save(&p).Error; err != nil { // 假设 model.DB 是 GORM 数据库连接的实例
		SendRsp(c, errcode.InternalError, nil) // 使用适当的错误码来表示内部错误
		return
	}

	// 发送成功响应（如果需要的话）
	// 例如：c.JSON(http.StatusOK, gin.H{"success": true, "likes": p.LikeCount})
	// 但由于您使用了 SendRsp，可能需要修改它以包含所需的响应数据
	SendRsp(c, errcode.OK, gin.H{"success": true, "likes": p.LikeCount, "collects": p.CollectCount})
}

// 添加博文
func Addpost(c *gin.Context) {
	var p model.Post
	if err := c.ShouldBind(&p); err != nil {
		SendRsp(c, errcode.ParamBindError, p)
		return
	}
	//验证器
	//validate:=validator.New()
	if err := valiutils.ValidateObj.Struct(&p); err != nil {
		SendRsp(c, errcode.DataValidatorError, nil)
		return
	}

	if err := p.Create(); err != nil {
		SendRsp(c, errcode.WriteError, nil)
		return
	}
	SendRsp(c, errcode.OK, p)
}

// 根据pid删除post
func Delpost(c *gin.Context) {
	id, err := strconv.Atoi(c.Param("id"))
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}
	p := &model.Post{
		Pid: uint64(id),
	}
	if err := p.Delete(); err != nil {
		SendRsp(c, errcode.DeleteError, nil)
		return
	}
	SendRsp(c, errcode.OK, p)
}

// 修改post信息
func Uppost(c *gin.Context) {
	id, err := strconv.Atoi(c.Param("id"))
	if err != nil {
		SendRsp(c, errcode.ParamTypeError, nil)
		return
	}
	s := &model.Post{
		Pid: uint64(id),
	}
	if err := c.ShouldBindJSON(s); err != nil {
		SendRsp(c, errcode.ParamBindError, nil)
		return
	}
	if err := s.Update(); err != nil {
		SendRsp(c, errcode.UpdateError, nil)
		return
	}
	SendRsp(c, errcode.OK, s)
}
